﻿using System;
using System.Windows.Forms;
using Nortec.Security;
using Nortec.Security.BusinessComponents;
using Nortec.Security.BusinessEntities;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win;
using System.Collections;

namespace Litografia.UI.Seguridad
{
    public partial class UsuariosForm : BaseForm
    {
        public UsuariosForm()
        {
            InitializeComponent();
        }

        #region Declarations
        BEUsuario.UsuarioDataTable appUsers;
        BEUsuario.UsuarioRow selectedUser;
        #endregion

        #region Event Handlers
        private void UsuariosForm_Load(object sender, EventArgs e)
        {
            ConfigureToolBar(toolStrip, ToolBarButtons.Save |
                                        ToolBarButtons.New |
                                        ToolBarButtons.Delete |
                                        ToolBarButtons.Close);
            LoadRolesList();
            LoadUsersGrid(true);
            ConfigureUsersGrid();
            
            toolStrip.ItemClicked += toolStrip_ItemClicked;
            ToggleButton(toolStrip, ToolBarButtons.Delete, false);
        }
        private void toolStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            switch ((ToolBarButtons)e.ClickedItem.Tag)
            {
                case ToolBarButtons.Save:
                    Save();
                    break;
                case ToolBarButtons.Delete:
                    Delete();
                    break;
                case ToolBarButtons.New:
                    ClearControls(Controls);
                    txtFirstName.Focus();
                    usuariosGrid.Selected.Rows.Clear();
                    break;
                case ToolBarButtons.Close:
                    Close();
                    break;
            }
        }
        private void usuariosGrid_AfterSelectChange(object sender, AfterSelectChangeEventArgs e)
        {
            if (usuariosGrid.Selected.Rows.Count > 0)
            {
                var selectedId = (int)usuariosGrid.Selected.Rows[0].Cells[appUsers.lit_usuario_idColumn.Ordinal].Value;
                selectedUser = appUsers.FindBylit_usuario_id(selectedId);
                UnPackUser(selectedUser);
                ToggleButton(toolStrip, ToolBarButtons.Delete, true);
            }
            else
            {
                selectedUser = null;
                ToggleButton(toolStrip, ToolBarButtons.Delete, false);
            }
        }
        #endregion

        #region Methods: Private
        private void LoadUsersGrid(bool sort)
        {
            appUsers = new BCSecurity().GetAllUsers(NortecMembership.ApplicationId);
            usuariosGrid.DataSource = appUsers;

            if (sort)
            {
                usuariosGrid.DisplayLayout.Bands[0].SortedColumns.Clear();
                usuariosGrid.DisplayLayout.Bands[0].SortedColumns.Add(usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_usernameColumn.Ordinal], false);
            }

            if (usuariosGrid.Rows.Count > 0)
            {
                usuariosGrid.ActiveRow = usuariosGrid.Rows[0];
               // usuariosGrid.Selected.Rows.Add(usuariosGrid.Rows[0]);
            }
            else
            {
                selectedUser = null;
                ToggleButton(toolStrip, ToolBarButtons.Delete, false);
            }
        }
        private void ConfigureUsersGrid()
        {

            // Oculta algunas columnas 
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_idColumn.Ordinal].Hidden = true;
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_aplicacion_idColumn.Ordinal].Hidden = true;
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_passwordColumn.Ordinal].Hidden = true;

            // Alineamientos
            foreach (UltraGridColumn col in usuariosGrid.DisplayLayout.Bands[0].Columns)
                col.Header.Appearance.TextHAlign = HAlign.Center;

            // Ancho de columnas
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_nombreColumn.Ordinal].Width = 122;
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_apellidoColumn.Ordinal].Width = 120;
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_usernameColumn.Ordinal].Width = 120;

            // Filters
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_nombreColumn.Ordinal].AllowRowFiltering = DefaultableBoolean.False;
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_apellidoColumn.Ordinal].AllowRowFiltering = DefaultableBoolean.False;
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_usernameColumn.Ordinal].AllowRowFiltering = DefaultableBoolean.False;

            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_nombreColumn.Ordinal].Header.Caption = "Nombre";
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_apellidoColumn.Ordinal].Header.Caption = "Apellido";
            usuariosGrid.DisplayLayout.Bands[0].Columns[appUsers.lit_usuario_usernameColumn.Ordinal].Header.Caption = "Login";

            usuariosGrid.DisplayLayout.Bands[0].Override.CellClickAction = CellClickAction.RowSelect;
        }
        private void UnPackUser(BEUsuario.UsuarioRow user)
        {
            BCSecurity securityObject = new BCSecurity();

            txtFirstName.Text = user.lit_usuario_nombre;
            txtLastName.Text = user.lit_usuario_apellido;
            txtUsername.Text = user.lit_usuario_username;
            txtPassword.Text = BCSecurity.Desencripta(user.lit_usuario_password);


            BERol.RolDataTable userRoles = securityObject.GetRolesForUser(user.lit_usuario_username, NortecMembership.ApplicationId);
            CheckRolesInList(userRoles);
        }
        private void CheckRolesInList(BERol.RolDataTable userRoles)
        {
            for (int i = 0; i < rolesList.Items.Count; i++)
            {
                BERol.RolRow rol = (BERol.RolRow)((System.Data.DataRowView)rolesList.Items[i]).Row;
                bool authorized = (userRoles.FindBylit_rol_id(rol.lit_rol_id) != null);
                rolesList.SetItemChecked(i, authorized);
            }

        }
        private void LoadRolesList()
        {
            BCSecurity securityObject = new BCSecurity();
            BERol.RolDataTable roles = securityObject.GetAllRoles(NortecMembership.ApplicationId);
            rolesList.DataSource = roles;
            rolesList.DisplayMember = roles.lit_rol_nombreColumn.ColumnName;
            rolesList.ValueMember = roles.lit_rol_idColumn.ColumnName;
        }
        private void Delete()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                if (selectedUser == null)
                    MessageBox.Show("Debe seleccionar un registro antes de eliminarlo.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                else
                {
                    if (MessageBox.Show("¿Está seguro de eliminar el usuario \"" + selectedUser.lit_usuario_nombre + " " + selectedUser.lit_usuario_apellido + "\"?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        BCSecurity securityObject = new BCSecurity();
                        securityObject.DeleteUser(selectedUser.lit_usuario_id);
                        LoadUsersGrid(false);
                        ShowConfirmation("El usuario fue eliminado con éxito");
                    }
                }
            }
            catch (Exception ex)
            {
                DisplayError("No se pudo eliminar el usuario debido a un error inesperado.", ex);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }
        private void Save()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                if (ValidateEntries())
                {
                    if (selectedUser == null)
                        CreateUser();
                    else
                        UpdateUser();

                    ClearControls(Controls);
                    LoadUsersGrid(false);
                }
            }
            catch (Exception ex)
            {
                DisplayError("No se pudo guardar la información.", ex);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }
        private bool ValidateEntries()
        {
            bool functionReturnValue = false;
            string msg = "";

            if (string.IsNullOrEmpty(txtFirstName.Text))
            {
                msg = "Debe ingresar el nombre del usuario";
                txtFirstName.Focus();
            }
            else if (string.IsNullOrEmpty(txtLastName.Text))
            {
                msg = "Debe ingresar el apellido del usuario";
                txtLastName.Focus();
            }
            else if (string.IsNullOrEmpty(txtUsername.Text))
            {
                msg = "Debe ingresar el login del usuario";
                txtUsername.Focus();
            }
            else if (string.IsNullOrEmpty(txtPassword.Text))
            {
                msg = "Debe ingresar la contraseña del usuario";
                txtPassword.Focus();
            }
            else
                functionReturnValue = true;

            if (!functionReturnValue)
                MessageBox.Show(msg, Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return functionReturnValue;
        }
        private void PackRoles(ArrayList rightArray)
        {
            for (int i = 0; i < rolesList.CheckedItems.Count; i++)
                rightArray.Add(((BERol.RolRow)((System.Data.DataRowView)rolesList.CheckedItems[i]).Row).lit_rol_id);
        }
        private int CreateUser()
        {
            ArrayList roles = new ArrayList();
            BCSecurity securityObject = new BCSecurity();
            PackRoles(roles);

            int newUserId = securityObject.CreateUser(txtUsername.Text.Trim(), txtPassword.Text.Trim(), txtFirstName.Text.Trim(), txtLastName.Text.Trim(), NortecMembership.ApplicationId, roles);
            if (newUserId > 0)
                ShowConfirmation("El usuario fue creado con éxito");
            else if (newUserId == 0)
                ShowError("El usuario que usted está intentando agregar ya existe");
            else ShowError("No se pudo agregar el rol debido a un error inesperado");
            return newUserId;
        }
        private int UpdateUser()
        {
            ArrayList roles = new ArrayList();
            BCSecurity securityObject = new BCSecurity();
            PackRoles(roles);
            bool success = securityObject.UpdateUser(txtUsername.Text.Trim(), txtPassword.Text.Trim(), txtFirstName.Text.Trim(), txtLastName.Text.Trim(), selectedUser.lit_usuario_id, roles);
            if (success)
                ShowConfirmation("El usuario fue actualizado con éxito");
            else ShowError("Se encontró un error durante la actualización del usuario");

            return selectedUser.lit_usuario_id;
        }
        #endregion

        

    }
}
